// zoj3940
// 题意：给定F(1, x) = x % A1, F(i, x) = F(i-1, x) % Ai, 2<=i<=n。
//       Ai是给定的长为n(<=100000)的数组，X是不超过M(<=10^9)的非负整数，
//       现在有q(<=10^5)个询问，询问F(n, x)=y的解的个数，y是给定整数。
//       假设第i个询问的结果是zi，最后输出sigma(i*zi)。
//
// 题解：注意到一个区间模除一个数得到的结果也可以用区间表示，并且左端点
//       都是0, 所以开始区间是[0, m]，先预处理出模这n个数后得到的区间，
//       可以用map维护。最后结果可以用map维护个前缀和。
//       一个数模除一堆数变化次数为O(log n)次，故最后区间个数为
//       O(n log n)个。最后复杂度就是O(n logn * logn)。
//
// run: $exec < input
// opt: 0
// flag: -g
#include <iostream>
#include <algorithm>
#include <vector>
#include <utility>
#include <set>
#include <map>

long long const mo = 1000000007;
int const maxn = 100007;
int a[maxn];
int n, m, q;

using interval = int;

int main()
{
	std::ios::sync_with_stdio(false);
	int T; std::cin >> T;
	while (T--) {
		std::cin >> n >> m;
		std::map<interval, int> all;
		std::set<int> right;
		right.insert(m);
		all[m] = 1;
		int min = 1 << 30;
		for (int i = 0, x; i < n; i++) {
			std::cin >> x;
			min = std::min(min, x);
			for (auto it = right.rbegin(); it != right.rend(); ) {
				auto inter = *it;
				auto count = all[*it];
				if (inter >= x) {
					int t = (inter + 1) / x;
					interval p1{x - 1};
					all.erase(*it);
					right.erase(*it);
					it = right.rbegin();
					if (all.find(p1) == all.end()) right.insert(p1);
					all[p1] += count * t;
					if ((inter + 1) % x) {
						interval p2 = inter % x;
						if (all.find(p2) == all.end()) right.insert(p2);
						all[p2] += count;
					}
				} else break;
			}
		}
		long long ans = 0;
		std::cin >> q;

		std::map<int, int> sum;
		sum[all.rbegin()->first] = all.rbegin()->second;
		for (auto it = std::next(all.rbegin()); it != all.rend(); ++it)
			sum[it->first] = sum[std::prev(it)->first] + it->second;

		for (int i = 1; i <= q; i++) {
			int y; std::cin >> y;
			if (y >= min) continue;
			auto it = right.lower_bound(y);
			long long tmp = sum[*it];
			ans = (ans + (tmp * i) % mo) % mo;
		}
		std::cout << ans << '\n';
	}
}

